package py.com.erpone.entity.dm;

import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

@Entity
@NamedQueries(value={@NamedQuery(name="solicitudPedidoCabecera.all",query="select p from SolicitudPedido p order by p.fecha"),
		@NamedQuery(name="solicitudPedidoCabeceraAdjudicados.all",query="select p from SolicitudPedido p where p.situacion='E' or p.situacion = 'O' order by p.fecha " )})           
public class SolicitudPedido implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public static final String SITUACION_ABIERTO = "O";
	public static final String SITUACION_ENVIADO = "E";
	public static final String SITUACION_ADJUDICADO = "A";
	public static final String SITUACION_CANCELADO = "C";	
	public static final String SITUACION_GENERANDO = "G";
	
	private static final HashMap<String, String> listSituacion = new HashMap<String, String>();

	static
	{
		listSituacion.put("Abierto", "O");
		listSituacion.put("Enviado", "E");
		listSituacion.put("Adjudicado", "A");
		listSituacion.put("Cancelado", "C");
		listSituacion.put("Generando", "G");

	}
	
	@Id
	@GeneratedValue
	private Long id;
	@NotNull
	private Date fecha;
	@NotNull
	@Size(max=50)
	private String situacion;
	@Transient
	private String situacionExtenso;
	@ManyToOne
	@NotNull
	private FormaPago formaPago;
	@ManyToOne
	@NotNull
	private Usuario usuario;
	@NotNull
	private Date fechaLimite;
	@OneToMany(fetch = FetchType.EAGER,mappedBy = "solicitudPedido",cascade=CascadeType.ALL,orphanRemoval=true)
	@NotNull
	private List<SolicitudPedidoDetalle> solicitudPedidosDetalle;
	@ManyToMany
	@LazyCollection(LazyCollectionOption.FALSE)
	@NotNull
	private List<Proveedor> proveedores;
	private double total;
	public SolicitudPedido() {
		super();
		
	}
	public SolicitudPedido(Long id, Date fecha, String situacion,
			FormaPago formaPago, Usuario usuario, Date fechaLimite,
			List<SolicitudPedidoDetalle> solicitudPedidosDetalle,
			List<Proveedor> proveedores, double total) {
		super();
		this.id = id;
		this.fecha = fecha;
		this.situacion = situacion;
		this.formaPago = formaPago;
		this.usuario = usuario;
		this.fechaLimite = fechaLimite;
		this.solicitudPedidosDetalle = solicitudPedidosDetalle;
		this.proveedores = proveedores;
		this.total = total;
	}
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public Date getFecha() {
		return fecha;
	}
	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}
	public String getSituacion() {
		return situacion;
	}
	@Transient
	public HashMap<String, String> getListSituacion() {
		return listSituacion;
	}
	public void setSituacion(String situacion) {
		this.situacion = situacion;
	}
	public FormaPago getFormaPago() {
		return formaPago;
	}
	public void setFormaPago(FormaPago formaPago) {
		this.formaPago = formaPago;
	}
	
	public double getTotal() {
		return total;
	}
	
	public String getSituacionExtenso() {
		return situacionExtenso;
	}
	public void setSituacionExtenso(String situacionExtenso) {
		this.situacionExtenso = situacionExtenso;
	}
	public void setTotal(double total) {
		this.total = total;
	}
	public Usuario getUsuario() {
		return usuario;
	}
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	public Date getFechaLimite() {
		return fechaLimite;
	}
	public void setFechaLimite(Date fechaLimite) {
		this.fechaLimite = fechaLimite;
	}
	public List<SolicitudPedidoDetalle> getSolicitudPedidosDetalle() {
		return solicitudPedidosDetalle;
	}
	public void setSolicitudPedidosDetalle(
			List<SolicitudPedidoDetalle> solicitudPedidosDetalle) {
		this.solicitudPedidosDetalle = solicitudPedidosDetalle;
	}
	public List<Proveedor> getProveedores() {
		return proveedores;
	}
	public void setProveedores(List<Proveedor> proveedores) {
		this.proveedores = proveedores;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((fecha == null) ? 0 : fecha.hashCode());
		result = prime * result
				+ ((fechaLimite == null) ? 0 : fechaLimite.hashCode());
		result = prime * result
				+ ((formaPago == null) ? 0 : formaPago.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result
				+ ((proveedores == null) ? 0 : proveedores.hashCode());
		result = prime * result
				+ ((situacion == null) ? 0 : situacion.hashCode());
		result = prime
				* result
				+ ((solicitudPedidosDetalle == null) ? 0
						: solicitudPedidosDetalle.hashCode());
		long temp;
		temp = Double.doubleToLongBits(total);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		result = prime * result + ((usuario == null) ? 0 : usuario.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		SolicitudPedido other = (SolicitudPedido) obj;
		if (fecha == null) {
			if (other.fecha != null)
				return false;
		} else if (!fecha.equals(other.fecha))
			return false;
		if (fechaLimite == null) {
			if (other.fechaLimite != null)
				return false;
		} else if (!fechaLimite.equals(other.fechaLimite))
			return false;
		if (formaPago == null) {
			if (other.formaPago != null)
				return false;
		} else if (!formaPago.equals(other.formaPago))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (proveedores == null) {
			if (other.proveedores != null)
				return false;
		} else if (!proveedores.equals(other.proveedores))
			return false;
		if (situacion == null) {
			if (other.situacion != null)
				return false;
		} else if (!situacion.equals(other.situacion))
			return false;
		if (solicitudPedidosDetalle == null) {
			if (other.solicitudPedidosDetalle != null)
				return false;
		} else if (!solicitudPedidosDetalle
				.equals(other.solicitudPedidosDetalle))
			return false;
		if (Double.doubleToLongBits(total) != Double
				.doubleToLongBits(other.total))
			return false;
		if (usuario == null) {
			if (other.usuario != null)
				return false;
		} else if (!usuario.equals(other.usuario))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "SolicitudPedido [id=" + id + ", fecha=" + fecha
				+ ", situacion=" + situacion + ", formaPago=" + formaPago
				+ ", usuario=" + usuario + ", fechaLimite=" + fechaLimite
				+ ", solicitudPedidosDetalle=" + solicitudPedidosDetalle
				+ ", proveedores=" + proveedores + ", total=" + total + "]";
	}
	
	
}
